package com.cellulam.framework.fs.excel;


import com.cellulam.framework.fs.common.DataTable;
import com.cellulam.framework.fs.excel.model.ExcelFileType;
import com.cellulam.framework.fs.excel.model.RowNumber;
import com.cellulam.framework.fs.excel.reader.ExcelReader;
import com.cellulam.framework.fs.excel.reader.SimpleTableReader;
import com.cellulam.framework.fs.excel.utils.DataTableUtils;
import com.cellulam.framework.fs.excel.writer.SimpleTableWriter;
import com.cellulam.framework.fs.exception.ExcelFileWriteException;
import org.apache.commons.io.IOUtils;

import java.io.*;
import java.util.List;

/**
 * excel工具类
 */
public final class ExcelUtil {

    /**
     * 导出excel 至 指定 文件, 按 简单-table格式
     * 第一行 为 标题
     * 从第二行开始 为数据行
     *
     * @param items
     * @param file
     * @param excelClass
     * @param <T>
     */
    public static final <T> void exportAsTable(List<T> items, File file, Class<T> excelClass) {
        try {
            exportAsTable(items, new FileOutputStream(file), excelClass);
        } catch (FileNotFoundException e) {
            throw new ExcelFileWriteException("export excel file error", e);
        }

    }


    /**
     * 导出excel 至 指定 流, 按 简单-table格式
     * 第一行 为 标题
     * 从第二行开始 为数据行
     *
     * @param items
     * @param os
     * @param excelClass
     * @param <T>
     */
    public static final <T> void exportAsTable(List<T> items, OutputStream os, Class<T> excelClass) {
        DataTable dataTable = DataTableUtils.build(items, excelClass);
        try {
            SimpleTableWriter.outputExcel(os, dataTable);
        } finally {
            IOUtils.closeQuietly(os);
        }
    }

    /**
     * 读取 excel文件 至集合
     * 读第一个sheet
     * 按字段顺序依次读取
     * 第一行为title
     * 从第二行开始读取
     *
     * @param localFile
     * @param tClass
     * @param <T>
     * @return
     */
    public static final <T extends RowNumber> List<T> readAsList(File localFile, Class<T> tClass) {
        return readAsList(localFile, tClass, 0);
    }

    /**
     * 读取 excel文件 至集合
     * 按字段顺序依次读取
     * 第一行为title
     * 从第二行开始读取
     *
     * @param localFile
     * @param tClass
     * @param <T>
     * @param sheetNo
     * @return
     */
    public static final <T extends RowNumber> List<T> readAsList(File localFile, Class<T> tClass, int sheetNo) {
        SimpleTableReader str = new SimpleTableReader(ExcelReader.readAsWorkbook(localFile));
        return str.readAsList(tClass, sheetNo, 1);
    }

    /**
     * 读取 excel流 至集合
     * 按字段顺序依次读取
     * 读第一个sheet
     * 从第二行开始读取
     *
     * @param is
     * @param tClass
     * @param <T>
     * @return
     */
    public static final <T extends RowNumber> List<T> readAsList(InputStream is, String extension, Class<T> tClass) {
        return readAsList(is, ExcelReader.detectExcelTypeByExtension(extension), tClass);
    }


    /**
     * 读取 excel流 至集合
     * 按字段顺序依次读取
     * 从第二行开始读取
     *
     * @param is
     * @param tClass
     * @param <T>
     * @return
     */
    public static final <T extends RowNumber> List<T> readAsList(InputStream is, String extension, Class<T> tClass, int sheetNo) {
        return readAsList(is, ExcelReader.detectExcelTypeByExtension(extension), tClass, sheetNo);
    }


    /**
     * 读取 excel流 至集合
     * 按字段顺序依次读取
     * 读第一个sheet
     * 从第二行开始读取
     *
     * @param is
     * @param tClass
     * @param <T>
     * @return
     */
    public static final <T extends RowNumber> List<T> readAsList(InputStream is, ExcelFileType fileType, Class<T> tClass) {
        return readAsList(is, fileType, tClass, 0);
    }


    /**
     * 读取 excel流 至集合
     * 按字段顺序依次读取
     * 从第二行开始读取
     *
     * @param is
     * @param tClass
     * @param <T>
     * @return
     */
    public static final <T extends RowNumber> List<T> readAsList(InputStream is, ExcelFileType fileType, Class<T> tClass, int sheetNo) {
        SimpleTableReader str = new SimpleTableReader(ExcelReader.readAsWorkbook(is, fileType));
        return str.readAsList(tClass, sheetNo, 1);
    }
}
